package it.gnocco.grafo;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import it.gnocco.log.Logger;
import it.gnocco.properties.*;


public class Grafo {
	private ArrayList<Nodo> nodi = new ArrayList<Nodo>();
	private static final String CLASS = "Grafo";
	private int numero_nodi = 10;
	private double[][] matrix = new double[numero_nodi][numero_nodi];
	
	public Grafo(Property prop){
		if(!prop.get("numero_nodi").equals("")){
			numero_nodi = Integer.valueOf(prop.get("numero_nodi"));
		}
		matrix = new double[numero_nodi][numero_nodi];
		for(int i = 0; i < numero_nodi; i++)
			nodi.add(new Nodo(i));
	}
	
	public double getPeso(int i, int j){
		String METHOD = "getPeso";
		if(i < nodi.size() & j < nodi.size()){
			return matrix[i][j]; 
		} else if(!(i < nodi.size())){
			Logger.log(Logger.ERROR, CLASS, METHOD, "Il primo indice chiesto e' maggiore di numero_nodi = " + numero_nodi);
		} else if(!(j < nodi.size())){
			Logger.log(Logger.ERROR, CLASS, METHOD, "Il secondo indice chiesto e' maggiore di numero_nodi = " + numero_nodi);
		}
		return -1;
	}
	
	public Nodo getNodo(int index){
		String METHOD = "getNodo";
		if(index < nodi.size()){
			return nodi.get(index); 
		}else{
			Logger.log(Logger.ERROR, CLASS, METHOD, "L'indice chiesto e' maggiore di numero_nodi = " + numero_nodi);
			return null;
		}
	}
	
	public int getSizeNodi(){
		return nodi.size();
	}
	
	public void leggiGrafoDaFile(File file){
		String METHOD = "leggiGrafoDaFile";
		try {
			FileReader fr = new FileReader(file);
			BufferedReader br = new BufferedReader(fr);
			String line = "";
			int j = 0;
			while((line = br.readLine())!=null){
				String[] linea = line.split(";");
				if (linea.length > numero_nodi)
					throw new ArrayIndexOutOfBoundsException();
				for(int i = 0; i < linea.length ; i++){
					matrix[i][j] = Double.valueOf(linea[i]);
					if(matrix[i][j] > 0){
						nodi.get(j).addNodo(nodi.get(i));
					}
				}
				j++;
			}
		} catch (ArrayIndexOutOfBoundsException e) {
			Logger.log(Logger.ERROR, CLASS, METHOD, "La matrice in input e' piu' grande di numero_nodi = " + numero_nodi);
			matrix = new double[numero_nodi][numero_nodi];
			Logger.log(Logger.ERROR, CLASS, METHOD, "la matrice e' stata inizializzata di nuovo");
		} catch (Exception e) {
			Logger.log(Logger.ERROR, CLASS, METHOD, e.getMessage());
		}
		
	}

}
